package com.crm.cc;

import android.content.Intent;
import android.text.TextUtils;
import android.util.Log;

import com.google.gson.Gson;
import com.luck.picture.lib.PictureSelector;
import com.luck.picture.lib.config.PictureConfig;
import com.luck.picture.lib.config.PictureMimeType;
import com.luck.picture.lib.entity.LocalMedia;
import com.luck.picture.lib.tools.PictureFileUtils;

import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.CallbackContext;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;

import static android.app.Activity.RESULT_OK;

/**
 * This class echoes a string called from JavaScript.
 */
public class androidpicture extends CordovaPlugin {
    CallbackContext callbackContext;

    @Override
    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
        this.callbackContext=callbackContext;
        String params=  args.getString(0);


        Log.d("androidpicture",action+" params="+params+"|isnull"+(params==null)+"|"+(params.equals("null"))+"|"+(params.equals("\"null\"")));
        if (action.equals("takePic")) {
            this.takePicByOption(PicOption.pareOption(params));
            return true;
        }else if(action.equals("takeSinglePic")){
            if (TextUtils.isEmpty(params)||params.equals("null")){
                this.takePicByOption(new PicOption(PictureConfig.SINGLE));
            }else {
                this.takePicByOption(PicOption.pareOption(params));
            }
            return true;
        }else if (action.equals("openCamera")){
            openCamera();
            return true;
        }
        else if(action.equals("clean")){
            this.deleteCacheDir();
            return true;
        }
        return false;
    }

    private void takePic(String message, CallbackContext callbackContext) {
        if (message != null && message.length() > 0) {
            callbackContext.success(message);
        } else {
            callbackContext.error("Expected one non-empty string argument.");
        }
    }

    private void deleteCacheDir(){
        PictureFileUtils.deleteCacheDirFile(cordova.getActivity());
    }
    private void takePicByOption(PicOption po){
        Log.d("androidpicture"," PicOption="+po.toString());
        tackPicOption(po.mimeType,po.maxCount,po.minCount,po.multiple,po.preview,po.camera,
        po.crop,po.compress,po.gif,po.selected,po.cropCompressQuality,po.cropWH);
    }

    /**
     *
     * @param mimeType 全部.PictureMimeType.ofAll()、图片.ofImage()、视频.ofVideo()、音频.ofAudio()
     * @param maxCount 最大图片选择数量 int
     * @param minCount 最小选择数量 int
     * @param multiple 多选 or 单选 PictureConfig.MULTIPLE or PictureConfig.SINGLE
     * @param preview  是否可预览图片
     * @param camera   是否显示拍照按钮
     * @param crop     裁剪宽
     * @param compress 是否压缩
     * @param gif      是否显示gif图片
     * @param selected 是否传入已选图片
     * @param cropCompressQuality 裁剪压缩质量
     * @param cropWH   裁剪宽高比，设置如果大于图片本身宽高则无效 int
     */
    private void tackPicOption(int mimeType,int maxCount,int minCount,int multiple,boolean preview,boolean camera,
                               boolean crop,boolean compress,boolean gif,List<LocalMedia> selected,int cropCompressQuality,int [] cropWH){
        // 进入相册 以下是例子：用不到的api可以不写
        cordova.setActivityResultCallback(this);
        PictureSelector.create(cordova.getActivity())
                .openGallery(mimeType)//全部.PictureMimeType.ofAll()、图片.ofImage()、视频.ofVideo()、音频.ofAudio()
                .maxSelectNum(maxCount)// 最大图片选择数量 int
                .minSelectNum(minCount)// 最小选择数量 int
                .imageSpanCount(4)// 每行显示个数 int
                .selectionMode(multiple)// 多选 or 单选 PictureConfig.MULTIPLE or PictureConfig.SINGLE
                .previewImage(preview)// 是否可预览图片 true or false
                .previewVideo(preview)// 是否可预览视频 true or false
                .enablePreviewAudio(preview) // 是否可播放音频 true or false
                .isCamera(camera)// 是否显示拍照按钮 true or false
//                .imageFormat(PictureMimeType.PNG)// 拍照保存图片格式后缀,默认jpeg
                .isZoomAnim(true)// 图片列表点击 缩放效果 默认true
                .sizeMultiplier(0.5f)// glide 加载图片大小 0~1之间 如设置 .glideOverride()无效
//                .setOutputCameraPath("/CustomPath")// 自定义拍照保存路径,可不填
                .enableCrop(crop)// 是否裁剪 true or false
                .compress(compress)// 是否压缩 true or false
//                .glideOverride()// int glide 加载宽高，越小图片列表越流畅，但会影响列表图片浏览的清晰度
//                .withAspectRatio()// int 裁剪比例 如16:9 3:2 3:4 1:1 可自定义
//                .hideBottomControls()// 是否显示uCrop工具栏，默认不显示 true or false
                .isGif(gif)// 是否显示gif图片 true or false
//                .compressSavePath(getPath())//压缩图片保存地址
                .freeStyleCropEnabled(true)// 裁剪框是否可拖拽 true or false
                .circleDimmedLayer(false)// 是否圆形裁剪 true or false
                .showCropFrame(true)// 是否显示裁剪矩形边框 圆形裁剪时建议设为false   true or false
                .showCropGrid(false)// 是否显示裁剪矩形网格 圆形裁剪时建议设为false    true or false
                .openClickSound(false)// 是否开启点击声音 true or false
                .selectionMedia(selected)// 是否传入已选图片 List<LocalMedia> list
                .previewEggs(true)// 预览图片时 是否增强左右滑动图片体验(图片滑动一半即可看到上一张是否选中) true or false
                .cropCompressQuality(cropCompressQuality)// 裁剪压缩质量 默认90 int
                .minimumCompressSize(100)// 小于100kb的图片不压缩
                .synOrAsy(true)//同步true或异步false 压缩 默认同步
                .cropWH(cropWH[0],cropWH[1])// 裁剪宽高比，设置如果大于图片本身宽高则无效 int
                .rotateEnabled(true) // 裁剪是否可旋转图片 true or false
                .scaleEnabled(true)// 裁剪是否可放大缩小图片 true or false
                .videoQuality(1)// 视频录制质量 0 or 1 int
                .videoMaxSecond(15)// 显示多少秒以内的视频or音频也可适用 int
                .videoMinSecond(10)// 显示多少秒以内的视频or音频也可适用 int
                .recordVideoSecond(60)//视频秒数录制 默认60s int
                .isDragFrame(false)// 是否可拖动裁剪框(固定)
                .forResult(PictureConfig.CHOOSE_REQUEST);//结果回调onActivityResult code

    }
    public void openCamera(){
        cordova.setActivityResultCallback(this);
        PictureSelector.create(cordova.getActivity())
                .openCamera(PictureMimeType.ofImage())
                .forResult(PictureConfig.CHOOSE_REQUEST);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        super.onActivityResult(requestCode, resultCode, intent);
        Log.d("androidpicture","onActivityResult"+requestCode);
        if (resultCode == RESULT_OK) {
            switch (requestCode) {
                case PictureConfig.CHOOSE_REQUEST:
                    // 图片、视频、音频选择结果回调
                    List<LocalMedia> selectList = PictureSelector.obtainMultipleResult(intent);
                    List<MyLocalMedia> mySelectList=pare(selectList);
                    // 例如 LocalMedia 里面返回三种path
                    // 1.media.getPath(); 为原图path
                    // 2.media.getCutPath();为裁剪后path，需判断media.isCut();是否为true  注意：音视频除外
                    // 3.media.getCompressPath();为压缩后path，需判断media.isCompressed();是否为true  注意：音视频除外
                    // 如果裁剪并压缩了，以取压缩路径为准，因为是先裁剪后压缩的
//                    adapter.setList(selectList);
//                    adapter.notifyDataSetChanged();
                    if (callbackContext!=null){
                        Gson gson=new Gson();
                           String jstr=  gson.toJson(mySelectList);
                        Log.d("androidpicture","result="+jstr);
                        try {
                            JSONArray jarr=new JSONArray(jstr);
                            callbackContext.success(jarr);
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
            }
        }
    }

    private List<MyLocalMedia> pare(List<LocalMedia> selectList) {
        List<MyLocalMedia> li=new ArrayList<>();
        if (selectList!=null){
            for (int i = 0; i < selectList.size(); i++) {
                MyLocalMedia m=MyLocalMedia.pare(new Gson().toJson(selectList.get(i)));
                li.add(m);
            }
        }
        return li;
    }
}
